管理アカウントから全メンバーアカウントを一括操作するためのIAMロールをAWS CloudFormation StackSetsで展開する方法
はじめに
管理アカウントから全メンバーアカウントを操作するために、AWS CloudFormation StackSetsを使用してIAMロールを展開する手順をまとめました。
以下の記事のように、管理アカウントから全メンバーアカウントに対して特定の操作を行いたい場合があるかと思います。
管理アカウントから全メンバーアカウントに対して操作を行うには、以下の手順でIAMロールを展開します。
- 管理アカウントから各リソースアカウントのリソースを操作するために必要なクロスアカウント用IAMロール(CrossAccountAdminRole)を作成する
- 管理アカウントからCloudFormation StackSetsを使用して、各リソースアカウントに対して一括でIAMロールを展開する
- その後、管理アカウントからAWS CloudShellを使用してスクリプトやAWS Lambdaを実行する。スクリプトやコードの内容は任意ですが、各アカウントのIAMロールにAssumeRoleを実行し、特定の作業を行うことを想定しています。
今回は、管理アカウントからCloudFormation StackSetsを使用し、各リソースアカウントに対してIAMロールを一括で展開する方法を解説します。
StackSetsの作成
今回、各メンバーアカウントに作成するIAMロールのCloudFormationテンプレートは以下の通りです。
arn:aws:iam::xxxxxxxxxxxx:root
は、管理アカウントIDを記載ください。
AWSTemplateFormatVersion: 2010-09-09
Description: Create IAM Role for Cross-Account Access with Administrator Access
Resources:
CrossAccountRole:
Type: AWS::IAM::Role
Properties:
RoleName: CrossAccountAdminRole
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
AWS: arn:aws:iam::xxxxxxxxxxxx:root
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AdministratorAccess
Path: /
Outputs:
CrossAccountRoleArn:
Description: ARN of the created IAM Role
Value: !GetAtt CrossAccountRole.Arn
Export:
Name: CrossAccountRoleArn
IAMロールの設定には、汎用的な設定と限定的な設定の2つのアプローチがあります。
汎用的な設定であれば、Admin権限を付与し、複数の用途で使用できる利点がありますが、誤操作時にアカウント全体に影響が及ぶリスクがあります。
一方、限定的な設定では、特定の権限のみを付与することでリスクを最小限に抑えることが可能です。
基本的には、後者の限定的なIAMロールの利用を推奨しますが、今回は管理者権限を持つIAMロールを使用します。
また、管理アカウントのどのリソースからAssumeRoleを受け入れるかを制限することも可能ですが、今回は管理アカウントからAWS LambdaやIAMユーザーなど、すべてのAssumeRoleを受け入れる設定にしています。
上記のテンプレートを利用し、管理アカウント上で、CloudFormation StackSetsを作成します。
設定は以下の通りです。
- アクセス許可モデル:サービスマネージドアクセス許可(SERVICE_MANAGED)
- テンプレート:cross-account-admin-role.yaml
- StackSet名:cross-account-admin-role
- マネージド型の実行:非アクティブ
- デプロイターゲット:組織へのデプロイ(全メンバーアカウントが対象であり、管理アカウントにはIAMロール作成されません)
- 自動デプロイオプション
- 自動デプロイ:アクティブ化済み
- アカウント削除の動作:スタックを削除
- リージョンの指定:東京リージョンのみ
- 同時アカウントの最大数(スタックを同時にデプロイできるリージョン別のアカウント数)
- 50
- 障害耐性(スタックが失敗できるリージョン別のアカウント数)
- 50
- 50
IAMロールはグローバルリソースのため、リージョン指定では東京リージョンの1リージョンを指定します。
同時アカウントの最大数と障害耐性は、アカウント数が多い場合、並列してスタックをデプロイできる方が早くオペレーションが完了するため、50にしました。各環境に併せて変更ください。
オペレーションが成功したことを、CloudFormationのコンソール画面で確認してください。
スタックインスタンスでスタックが作成されたアカウントが確認できます。
このIAMロールを利用して、冒頭でもご紹介した以下のようなことができます。
- マルチアカウント環境における全アカウント・全リージョンのSecurity Hubセキュリティ基準を一括集計して確認してみた
- 全メンバーアカウントにおける全リージョンのAWS IAM Access Analyzerを一括削除してみた
スタックを削除する
作業が完了し、IAMロールが不要になった場合は、「StackSet からスタックを削除」を選択して削除できます。
以下の設定を使用してスタックを削除します。
- AWS OU ID:r-o2pk(Root OU)
- リージョンの指定:東京リージョン
- 同時アカウントの最大数:50
- 障害耐性:50
オペレーションが成功したことを確認してください。
これで各メンバーアカウントに展開したIAMロールは削除されました。
スタックを追加する
この後、「StackSet を削除」を選択することで、StackSetを削除できます。
ただし、再度IAMロールが必要になる可能性がある場合は、StackSetを削除せずに残しておくことで、必要なタイミングでStackSetにスタックを追加し、各リソースアカウントにIAMロールを再作成できます。
再作成する場合は、「アクション」から「StackSet にスタックを追加」を選択します。
以下の設定を使用してスタックを追加します。
- デプロイターゲット:組織へのデプロイ
- リージョンの指定:東京リージョン
- 同時アカウントの最大数:50
- 障害耐性:50
オペレーションが成功したことを確認します。
これでスタックの再作成が完了しました。